﻿// 小国王.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


using  namespace  std;

/*
https://loj.ac/p/10170
http://ybt.ssoier.cn:8088/problem_show.php?pid=1592
在 n x n 的棋盘上放 k 个国王，国王可攻击相邻的 8 个格子，求使它们无法互相攻击的方案总数。

输入格式
只有一行，包含两个整数 n 和 k。

输出格式
每组数据一行为方案总数，若不能够放置则输出 0。

输入 
3 2
输出
16

输入
4 4 
输出 
79

对于全部数据，1 <= n <=  10, 0 <=  k <= n^2。
*/

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 12, M = 1 << 10, K = 110;
int n, m;
vector<int> state;
int id[M], cnt[M];
vector<int> head[M];
long long  f[N][K][M];

bool check(int state) {
	for (int i = 0; i < n; i++) {
		if (((state >> i) & 1) && ((state >> (i + 1)) & 1)) {
			return false;
		}
	}

	return true;
}

int count(int state) {
	int res = 0;
	for (int i = 0; i < n; i++) {
		res += state >> i & 1;
	}
	return res;
}


int main()
{
	cin >> n >> m;
	for (int i = 0; i < 1 << n; i++) {
		if (check(i)) {
			state.push_back(i);
			id[i] = state.size() - 1;
			cnt[i] = count(i);
		}
	}

	for (int i = 0; i < state.size(); i++) {
		for (int j = 0; j < state.size(); j++) {
			int a = state[i], b = state[j];
			if ((a & b) == 0 && check(a | b)) {
				head[i].push_back(j);
			}
		}
	}

	f[0][0][0] = 1;
	for (int i = 1; i <= n+1; i++) {
		for (int j = 0; j <= m; j++) {
			for (int a = 0; a < state.size(); a++) {
				for (int b : head[a]) {
					int c = cnt[state[a]];
					if (j >= c) {
						f[i][j][a] += f[i - 1][j - c][b];
					}
				}
			}
		}
	}

	cout << f[n + 1][m][0] << endl;

	return 0;
}

 